package com.blumov.fastbox.application.util;

import java.io.UnsupportedEncodingException;

import org.apache.log4j.Logger;
import org.springframework.context.MessageSource;

import com.blumov.fastbox.domain.enums.ErrorCode;
import com.blumov.fastbox.domain.exceptions.NonBusinessException;

/**
 * Implementacion para cargar los mensajes desde un properties. Internamente
 * utiliza el bean {@link MessageSource} de Spring.
 * 
 * @author Bruno Masci
 */
public class MessageProviderImpl implements MessageProvider {
	private static final String MESSAGES_ENCODING = "UTF-8";
	private MessageSource messageResource;
	private MessageSource labelSource;

	private Logger logger = Logger.getLogger(MessageProviderImpl.class);

	
	public String getLabel(String key) {
		String encodedMessage = "";
		try {
			String message = labelSource.getMessage(key, null, null);
			if (message == null) {
				throw new NonBusinessException(ErrorCode.E0009, key);
			}
			encodedMessage = new String(message.getBytes(), MESSAGES_ENCODING);
		} catch (UnsupportedEncodingException e) {
			logger.warn(ErrorCode.E0007);
		}
		return encodedMessage;
	}

	/**
	 * Busca en los archivos properties el mensaje asociado a la key utilizando la default Locale
	 * 
	 * @param key
	 * @return el mensaje asociado a key
	 */
	private String getMessage(String key) {
		String encodedMessage = "";
		try {
			String message = messageResource.getMessage(key, null, null);
			if (message == null) {
				throw new NonBusinessException(ErrorCode.E0009, key);
			}
			encodedMessage = new String(message.getBytes(), MESSAGES_ENCODING);
		} catch (UnsupportedEncodingException e) {
			logger.warn(ErrorCode.E0007);
		}
		return encodedMessage;
	}

//	public String getAsuntoContactoDirecto() {
//		return this.getMessage(Constants.ASUNTO_CONTACTO_DIRECTO);
//	}

	/**
	 * @param messageResource
	 *            the messageResource to set
	 */
	public void setMessageResource(MessageSource messageResource) {
		this.messageResource = messageResource;
	}

	/**
	 * @param labelSource
	 */
	public void setLabelSource(MessageSource labelSource) {
		this.labelSource = labelSource;
	}
}
